Java 22 的到来!

在 X 上关注 JavaOpenJDK

JDK 22 现已推出!

Oracle 很自豪地宣布 JDK 22 现已面向开发人员、企业和最终用户正式发布。

Java 22 的新功能

JDK 22 提供了 12 项增强功能,这些增强功能足够重要,值得拥有自己的 JDK 增强提案 (JEP),包括七项预览功能和一项孵化器功能。它们涵盖了对 Java 语言、其 API、其性能以及 JDK 中包含的工具的改进。

语言改进

无名变量和模式 - JEP 456

在需要变量声明或嵌套模式但未使用时,提高可读性。两者都用下划线字符表示。

价值

  • 捕获开发人员的意图,即给定绑定或 lambda 参数未使用,并强制执行该属性以澄清程序并减少错误的机会。
  • 通过识别必须声明但未使用的变量(例如,在 catch 子句中)来提高所有代码的可维护性。
  • 如果多个模式都没有声明任何模式变量,则允许多个模式出现在单个 case 标签中。
  • 通过省略不必要的嵌套类型模式来提高记录模式的可读性。

语言预览

语句在 super (…) 之前 [预览] - JEP 447

在构造函数中,允许在显式构造函数调用之前出现不引用正在创建的实例的语句。

价值

  • 为开发人员提供更大的自由来表达构造函数的行为,从而能够更自然地放置当前必须分解为辅助静态方法、辅助中间构造函数或构造函数参数的逻辑。
  • 保留现有的保证,即构造函数在类实例化期间以自上而下的顺序运行,确保子类构造函数中的代码不会干扰超类实例化。
  • 不需要对 Java 虚拟机进行任何更改。此 Java 语言功能仅依赖于 JVM 当前能够验证和执行出现在构造函数中显式构造函数调用之前的代码的能力。

字符串模板 (第 2 次预览) - JEP 459

字符串模板通过将文字文本与嵌入表达式和模板处理器相结合以生成专门的结果,来补充 Java 现有的字符串文字和文本块。

价值

  • 通过简化在运行时包含计算值的字符串的表达方式,简化了 Java 程序的编写。
  • 增强了混合文本和表达式的表达式的可读性,无论文本是否适合单个源代码行(如字符串文字)或跨越多个源代码行(如文本块)。
  • 通过支持对模板及其嵌入表达式的值的验证和转换,提高了从用户提供的值组合字符串并将其传递给其他系统(例如,构建数据库查询)的 Java 程序的安全性。
  • 通过允许 Java 库定义字符串模板中使用的格式语法来保留灵活性。
  • 简化了使用接受以非 Java 语言(例如 SQL、XML 和 JSON)编写的字符串的 API。
  • 能够从文字文本和嵌入表达式计算出非字符串值,而无需通过中间字符串表示形式。

隐式声明的类和实例主方法 (第 2 次预览) - JEP 463

学生可以在不需要理解为大型程序设计的语言功能的情况下编写他们的第一个 Java 程序。学生无需使用语言的单独方言,而是可以为单类程序编写简化的声明,然后随着技能的提高,无缝地扩展他们的程序以使用更高级的功能。

价值

为了加速 Java 的学习 -

  • 为 Java 编程提供了一个平稳的入门,以便讲师可以逐步介绍概念。
  • 帮助学生以简洁的方式编写基本程序,并随着技能的提高逐步扩展他们的代码。
  • 减少了编写简单程序(如脚本和命令行实用程序)的仪式。
  • 不引入单独的初学者 Java 语言方言。
  • 不引入单独的初学者工具链;学生程序应该使用与编译和运行任何 Java 程序相同的工具进行编译和运行。

外部函数和内存 API - JEP 454

允许 Java 程序与 Java 运行时之外的代码和数据进行交互。通过有效地调用外部函数(即 JVM 之外的代码),以及通过安全地访问外部内存(即 JVM 不管理的内存),该 API 使 Java 程序能够调用本机库并处理本机数据,而不会出现 JNI 的脆弱性和危险。

价值

  • 生产力 - 用简洁、可读且纯 Java 的 API 替换本机方法和 Java 本机接口 (JNI) 的脆弱机制。
  • 性能 - 提供对外部函数和内存的访问,其开销可与 JNI 和 sun.misc.Unsafe 相媲美,甚至更好。
  • 广泛的平台支持 - 能够在 JVM 运行的每个平台上发现和调用本机库。
  • 统一性 - 提供操作结构化和非结构化数据的方法,这些数据可以是无限大小的,并且存在于多种类型的内存中(例如,本机内存、持久内存和托管堆内存)。
  • 健全性 - 保证没有使用后释放错误,即使内存是在多个线程中分配和释放的。
  • 完整性 - 允许程序使用本机代码和数据执行不安全的操作,但默认情况下会向用户发出有关此类操作的警告。

库预览和孵化器

类文件 API (预览) - JEP 457

提供用于解析、生成和转换 Java 类文件的标准 API。

价值

  • 该 API 允许依赖它的框架和程序自动支持来自最新 JDK 的最新类文件,以便可以快速轻松地采用在类文件中表示的新语言和 VM 功能。

流收集器 (预览) - JEP 461

增强了 Stream API 以支持自定义中间操作。这将允许流管道以无法通过现有内置中间操作轻松实现的方式转换数据。

价值

  • 通过使流中的常见自定义操作更加灵活和富有表现力,提高了开发人员的生产力和代码可读性。尽可能地允许中间操作操作无限大小的流。

结构化并发 (第 2 次预览) - JEP 462

简化并发编程。结构化并发将运行在不同线程中的相关任务组视为一个工作单元,从而简化了错误处理和取消,提高了可靠性并增强了可观察性。

价值

  • 通过推广一种可以消除由取消和关闭引起的常见风险(例如线程泄漏和取消延迟)的编程风格,简化了并发代码的开发,并提高了并发代码的可观察性。

作用域值 (第 2 次预览) - JEP 464

能够在线程内部和线程之间高效地共享不可变数据。

价值

  • 易用性 - 提供一个编程模型来在单个线程内以及与子线程共享数据,以简化对数据流的推理。
  • 可理解性 - 使共享数据的生命周期从代码的语法结构中可见。
  • 健壮性 - 确保调用者共享的数据只能被合法调用者检索。
  • 性能 - 将共享数据视为不可变数据,以允许大量线程共享,并启用运行时优化。

向量 API (第 7 次孵化器) - JEP 460

一个用于表达向量计算的 API,它可以在运行时可靠地编译到支持的 CPU 架构上的最佳向量指令,从而实现优于等效标量计算的性能。此 JEP 提案在 JDK 22 中重新孵化该 API,相对于 JDK 21,API 进行了细微的增强。实现包括错误修复和性能增强。我们包括以下值得注意的更改

  • 支持使用由任何基本元素类型数组支持的堆内存段的向量访问。以前访问仅限于由字节数组支持的堆内存段。

价值

  • 提供一个清晰简洁的 API,能够清晰简洁地表达各种向量计算,这些计算由循环内组成的向量操作序列组成,并且可能包含控制流。
  • 该 API 旨在与 CPU 架构无关,支持在支持向量指令的多个架构上实现。
  • 在 x64 和 AArch64 架构上提供可靠的运行时编译和性能。
  • 与 Valhalla 项目保持一致。

性能

G1 的区域固定 - JEP 423

通过在 G1 中实现区域固定来减少延迟,以便在 Java 本地接口 (JNI) 关键区域期间不需要禁用垃圾收集。

价值

  • 通过消除 Java 线程在使用 JNI 时等待 G1 GC 操作完成的需要,提高了开发人员的生产力。

工具

启动多文件源代码程序 - JEP 458

允许用户运行作为多个 Java 源代码文件提供的程序,而无需先编译它。

价值

  • 通过使从小型程序到大型程序的过渡更加平滑,提高了开发人员的生产力,使开发人员可以选择是否以及何时配置构建工具。

请注意,预览功能是 Java SE 平台的完全指定和完全实现的语言或 VM 功能,但它们是临时的。它们在 JDK 功能版本中提供,以便在它们在将来的版本中成为永久性功能之前,允许开发人员根据实际使用情况提供反馈。这也为工具供应商提供了在功能最终确定为 Java SE 标准之前支持功能的机会。

位于 孵化器模块 中的 API 将非最终 API 和非最终工具提供给开发人员和用户,以收集反馈,最终将提高 Java 平台的质量。

除了 JEP 中描述的更改之外,发行说明 中还列出了许多较小的更新,这些更新将引起许多应用程序开发人员和系统管理员的兴趣。这些包括弃用过时的 API 和删除以前已弃用的 API。

Java 22 发行说明中的一些关键更新

  • 在 keytool 和 jarsigner 中添加了其他算法。
  • 垃圾收集器吞吐量改进,尤其是在与“年轻”垃圾相关的方面。
  • 为系统模块描述符提供更好的版本报告。
  • 改进了本机代码的“等待”处理选项。
  • Unicode 通用区域数据存储库已更新至版本 44。
  • 对从字节码加载的类型进行类型注释支持。
  • ForkJoinPool 和 ForJoinTasks 现在可以更好地处理不可中断的任务。
  • 为配置客户端与服务器 TLS 连接属性提供了额外的灵活性。
  • 改进了本机内存跟踪,包括报告峰值使用情况的能力

最后,与所有功能版本一样,JDK 22 包含数百项性能、稳定性和安全性更新,包括适应底层操作系统和固件更新以及标准。用户和应用程序开发人员通常会从这些更改中受益,而不会注意到它们

以及所有 JDK 版本中包含的恒定功能:可预测性

JDK 22 是通过六个月的发布节奏按时交付的第 13 个功能版本。这种可预测性水平使开发人员能够轻松管理他们对创新的采用,这得益于稳定的预期改进流。

Chart showing number of features per release since Java 8

Java 提高性能、稳定性和安全性的能力使其成为世界上最流行的编程语言。

Oracle 不会为 JDK 22 提供长期支持;我们将提供更新,直到 2024 年 9 月,届时它将被 Oracle JDK 23 取代。

Java 22,共同

与以前的版本一样,Java 22 庆祝了 OpenJDK 社区中许多个人和组织的贡献——我们共同构建 Java!

JDK 22 修复率

JDK 版本随时间变化的速率多年来一直保持相对稳定,但在六个月的节奏下,生产就绪功能和改进的交付速度急剧加快。

我们不再像过去的主要版本那样,每隔几年进行数万次修复并交付近一百个 JEP(JDK 增强提案),而是以更精简的功能版本以更易于管理和可预测的六个月时间表交付增强功能。更改范围从重大新功能到小型增强功能,再到例行维护、错误修复和文档改进。每个更改都以 JDK 错误系统中单个问题的单个提交表示。

在 Java 11 到 Java 22 中,在它们发布时标记为已修复的 26,447 个 JIRA 问题中,18,842 个由 Oracle 员工完成,而 7,605 个由个人开发人员和为其他组织工作的开发人员贡献。通过查看问题并从分配者那里整理组织数据,得出了以下组织赞助 Java 开发贡献的图表

Issues fixed in JDK 11-JDK 22 per organization

在 Java 22 中,在标记为已修复的 2,251 个 JIRA 问题中,1,554 个由 Oracle 完成,而 697 个由 Java 社区的其他成员贡献。

Issues fixed in JDK 22 per organization

Oracle 感谢为 Amazon、ARM、Google、华为、IBM、Intel、ISCAS、Microsoft、Red Hat、Rivos、SAP 和腾讯等组织工作的开发人员的杰出贡献。我们也感谢看到来自 Bellsoft Data Dog 和 Loongson 等小型组织的贡献,以及独立开发人员的贡献,他们共同贡献了 Java 22 中 7% 的修复。

此外,通过 OpenJDK 质量推广 计划,我们感谢以下 FOSS 项目,他们在测试 Java 22 早期访问版本方面提供了宝贵的反馈,以帮助提高版本的质量

  • Apache Syncope (Francesco Chicchiriccò)
  • Apache Tomcat (Mark Thomas)
  • ApprovalTests.Java (Lars Eckart)
  • AssertJ (Stefano Cordio)
  • Avaje (Josiah Noel)
  • Jetty (Simone Bordet)
  • MyBatis (Iwao Ave)
  • Parallel Collectors (Grzegorz Piwowarek)
  • RxJava (David Karnok)

资源

Java 仍然是当今技术趋势的 #1 编程语言。正如 Java 22 按时交付改进所证明的那样,通过持续的周到规划和生态系统参与,Java 平台已为云中的现代开发和增长做好了充分准备。

继续关注新闻和更新,方法是

  • 访问 Dev.java(Oracle 专注于提升您的 Java 知识和社区参与的网站)。
  • 访问 Inside.java(Oracle Java 团队的新闻和观点)。
  • 收听 Inside.java 播客(由 Oracle 的 Java 制作者为您带来的面向 Java 开发人员的音频节目。对话将讨论语言、JVM、OpenJDK、平台安全性、Loom 和 Panama 等创新项目,以及介于两者之间的所有内容)。
  • 观看 Inside.java 新闻广播(将 Inside.java 播客扩展为视频格式的视频节目)。
  • 观看 YouTube 上的 Java(Oracle 收集的相关 Java 视频,以帮助您提高 Java 专业知识)。
  • 观看 JEP 咖啡馆(Oracle 对流行的 JDK 增强提案进行的技术探索)。
  • 观看 Sip of Java(Oracle 的 1 分钟短视频,介绍提供性能、稳定性和安全性改进的鲜为人知的 Java 增强功能)。
  • 加入 OpenJDK 邮件列表(了解您最喜欢的 OpenJDK 项目进展的地方)。
  • 在 X 上关注 OpenJDKJava(提供 Java 不断发展的更新和新闻的社交流)。
  • 订阅 Inside Java 新闻稿(每月出版物,总结 Oracle 的许多关键 Java 技术和社区更新)。